Imports DataAccesGenerales
Imports DataAcces
Imports System.Data

Partial Class Documentos_Inventario_Naviero_Inventario_NavieroDocumento
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
      If Not Page.IsPostBack Then
        Dim datosUsuario As New dataLogin
        Dim consGenerales As New DataAccesGenerales()
        datosUsuario = Session("Data_Login")
        Dim nidDocumento As String = Request.QueryString("nidDocumento")
        Dim nidUsuario As Long
        nidUsuario = consGenerales.usuarioObtieneNidUsuario(Session("Data_Login"))
        'Me.ctlArchivoAnexos.asignarParametros(nidUsuario, nidDocumento, 3)

        If Not nidDocumento = String.Empty Then
          Me.ctlEncabezadoDocumento.ObtenerDocumento(CLng(nidDocumento))
          cargarDatos()
          cargarConsulta(CLng(nidDocumento))
          habilitarCampos(CInt(Me.ctlEncabezadoDocumento.EstadoDocumento))
        Else
          Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Nuevo
          habilitarCampos(enumEstadoDeDocumento.Nuevo)
          'Me.ctlArchivoAnexos.eliminarArchivosLista()
          If consGenerales.usuarioTieneElRol(nidUsuario, ?nidRol) <> 1 Then 'nidRol=nid tipo de usuario que tiene permiso para el documento
            ctlToolBar.Visible = False
            mensaje("No tiene Permisos para este documento")
          End If
        End If
      End If
    Catch ex As Exception
      mensaje("Error al cargar Pagina: " + ex.Message)
    End Try
  End Sub

#Region "Eventos"
  Protected Sub ctlToolbar_BtnNuevoClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnNuevoClicked
    nuevoDocumento()
    cargarDatos()
  End Sub
  Protected Sub ctlToolbar_BtnGuardarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnGuardarClicked
    If VerificarDatos() Then
      If Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar Then
        crearDocumento()
        If Me.ctlEncabezadoDocumento.NidDocumento <> 0 Then
          guardarDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Me.hfGuardar.Value)
        End If
      Else
        guardarDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Me.hfGuardar.Value)
      End If
    End If
  End Sub
  Protected Sub ctlToolbar_BtnAprobarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnAprobarClicked
    firmarDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnEditarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnEditarClicked
    editarDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnImprimirClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnImprimirClicked
    imprimirDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnListaClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnListaClicked
    consultarIncidencias()
  End Sub
  Protected Sub ctlToolbar_BtnRechazarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnRechazarClicked
    cancelarDocumento()
  End Sub
  
  Protected Sub ctlDocumentoCancelar_BtnCancelarDoc(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlDocumentoCancelar.BtnCancelarDoc
    If Not Me.ctlDocumentoCancelar.DescripcionCancelacion = String.Empty Then
      confirmarDocumento(enumEstadoDeDocumento.Rechazado)
    Else
      mensaje("Debe indicar el motivo de rechazo")
    End If
  End Sub
  
   Protected Sub ctlDocumentoFirmar_BtnFirmarDoc(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlDocumentoFirmar.BtnFirmarDoc
    If Me.ctlDocumentoFirmar.validarCertificadosAgregados() Then
      If Me.ctlDocumentoFirmar.validarExtensionLlaves() Then
        If Me.ctlDocumentoFirmar.validarContrase�a() Then
          Try
            firmar()
          Catch ex As Exception
            mensaje(ex.Message)
          End Try
        Else
          mensaje("Debe indicar la contrase�as")
        End If
      Else
        mensaje("Los archivo de llave Privada � P�blica no son validos")
      End If
    Else
      mensaje("Debe cargar las llaves Privada y P�blica")
    End If

  End Sub
  
  
  
#End Region

#Region "Metodos"
  ''' <summary>
  ''' Metodo para cargar todos los datos requeridos para llenar el archivo
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub cargarDatos()
    'Datos a cargar al inicio del documento
  End Sub
  ''' <summary>
  ''' Metodo para cargar los datos al consultar el documento previamente creado y guardado en la base de datos
  ''' </summary>
  ''' <param name="nidDocumento"> nid del documento a cargar</param>
  ''' <remarks></remarks>
  Private Sub cargarConsulta(nidDocumento As Integer)
    'Carga los datos de una consulta del documento
	Me.hfGuardar.Value = 1 'tipo de guardado de modificacion
	Dim dInventario_Naviero As New DataAccesInventario_Naviero
    Dim tablaInventario_Naviero As DataTable
	
	tablaInventario_Naviero = dInventario_Naviero.Inventario_Naviero_Consultar(Me.ctlEncabezadoDocumento.NidDocumento)
	
  End Sub
  ''' <summary>
  ''' Metodo para habilitar los campos dependiendo del estado actual del documento
  ''' el cual puede ser alguna de estas opciones:
  ''' Nuevo
  ''' NuevoAGuardar
  ''' PendienteDeAprobacion
  ''' Aprobado
  ''' Rechazado
  ''' Terminado
  ''' </summary>
  ''' <param name="estadoDoc"> estado del documento actualmente</param>
  ''' <remarks>El estado se obtine del control ctlEncabezadoDocumento</remarks>
  Private Sub habilitarCampos(ByVal estadoDoc As DataAccesGenerales.enumEstadoDeDocumento)
    Select Case estadoDoc
      Case enumEstadoDeDocumento.Nuevo
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Nuevo)

      Case enumEstadoDeDocumento.NuevoAGuardar
        habilitarDocumento(True)
        ' Header
        Me.ctlEncabezadoDocumento.TextoCodigo = textoEcabezado.enElaboracion
        Me.ctlEncabezadoDocumento.TextoFechaCreacion = Now.Date.ToShortDateString()
        Me.ctlEncabezadoDocumento.TextoEstado = textoEcabezado.nuevo
        Dim datUsuario As New DataAccesGenerales()
        Me.ctlEncabezadoDocumento.TextoEmisor = datUsuario.usuarioObtieneNombre(Session("Data_Login"))
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.NuevoAGuardar)

      Case enumEstadoDeDocumento.PendienteDeAprobacion
        Dim conDoc As New DataAccesGenerales()
        If conDoc.consultaUsuarioTienFlujoActual(Me.ctlEncabezadoDocumento.NidDocumento, Session("Data_Login")) = 1 Then
          If conDoc.usuarioEsCreadorDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Session("Data_Login")) = creadorDocumento.esUsuarioCreador Then
            habilitarDocumento(True)
          Else
            habilitarDocumento(False)
          End If
        Else
          habilitarDocumento(False)
        End If
        Me.ctlToolBar.NidDocumentoValor = Me.ctlEncabezadoDocumento.NidDocumento
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.PendienteDeAprobacion)

      Case enumEstadoDeDocumento.Aprobado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Aprobado)

      Case enumEstadoDeDocumento.Rechazado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Rechazado)

      Case enumEstadoDeDocumento.Terminado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Terminado)
    End Select
  End Sub
  ''' <summary>
  ''' Metodo para establecer un encabezado al documento, generando una nueva clave de documento
  ''' y cambiando su estado a NuevoAGuardar
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub nuevoDocumento()
    'Genera un encabezado del documento
    Dim datUsuario As New DataAccesGenerales()
    Me.ctlEncabezadoDocumento.TextoEmisor = datUsuario.usuarioObtieneNombre(Session("Data_Login"))
    Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar
    Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.NuevoAGuardar)

    Me.ctlEncabezadoDocumento.TextoCodigo = textoEcabezado.enElaboracion
    Me.ctlEncabezadoDocumento.TextoFechaCreacion = Now.Date.ToShortDateString()
    Me.ctlEncabezadoDocumento.TextoEstado = textoEcabezado.nuevo
    habilitarDocumento(True)
  End Sub
  ''' <summary>
  ''' Metodo para habilitar o desabilitar los componentes del documento
  ''' </summary>
  ''' <param name="bol_Estado">True o False</param>
  ''' <remarks></remarks>
  Private Sub habilitarDocumento(bol_Estado As Boolean)
    'Habilita los campos necesarios para realizar el documento

  End Sub
  ''' <summary>
  ''' Metodo para insertar un nuevo documento en la base de datos
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub crearDocumento()
    'Crea un documento nuevo en la base de datos
    Dim dGenerales As New DataAccesGenerales
    Dim nidEmpresa As Integer = dGenerales.UsuarioObtieneNidEmpresa(Session("Data_Login"))
    Dim nidusuario As Integer = dGenerales.usuarioObtieneNidUsuario(Session("Data_Login"))
    Dim documentoNoGuardado As Byte = 0
    Dim nidDocumento As Integer = 0
    Dim transaccionFlujo As Byte = 0 ' Crea flujo documento 

    Try
      nidDocumento = dGenerales.insertaEncabezadoDocumento(enumTipoDocumento.Inventario_Naviero, nidEmpresa, nidusuario) ' Crea encabezado documetno
      If nidDocumento <> transaccion.transaccionNoTerminada Then
        transaccionFlujo = dGenerales.insertaFlujoDocumento(nidDocumento, enumTipoDocumento.Inventario_Naviero, nidusuario)
        If transaccionFlujo <> transaccion.transaccionNoTerminada Then ' Crea flujo documento detalle
          Me.ctlEncabezadoDocumento.NidDocumento = nidDocumento
          ctlEncabezadoDocumento.ObtenerDocumento(nidDocumento)
          Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.PendienteDeAprobacion
          Me.ctlToolBar.NidDocumentoValor = nidDocumento
          Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.PendienteDeAprobacion)
        End If
      End If
    Catch ex As Exception
      mensaje("Error en crearDocumento(): " & ex.Message)
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para guardar el archivo creado en la base de datos
  ''' pasando como parametros el nid del documento y un tipo de guardado
  ''' el cual es:
  ''' 0: insertar nuevo
  ''' 1: actualizar
  ''' </summary>
  ''' <param name="nidDocumento">nid del documento actual</param>
  ''' <param name="tipoGuradado">tipo de guardado</param>
  ''' <remarks>el nid documento se obtiene del control ctlEncabezadoDocumento</remarks>
  Private Sub guardarDocumento(nidDocumento As Integer, tipoGuradado As Integer)
    'Datos necesarios para guardar el documento
	Dim transaccion As Byte = 0
    Dim str_Mensaje As String = ""
    Dim dInventario_Naviero As New DataAccesInventario_Naviero
	Dim pnid As Integer
    Dim pnidDocumento As Integer
    Dim pnidBuque As Integer
    Dim pnombre_Buque As String
    Dim pnidNaviera As Integer
    Dim ptipo_Maniobra As String
    Dim pobservaciones As String
    Dim pnidViaje As Integer
    Dim pregistro As String
    Dim pyear As String
    

    Try
      If tipoGuradado = 0 Then
        transaccion = dInventario_Naviero.Inventario_Naviero_Insertar(pnid, pnidDocumento, pnidBuque, pnombre_Buque, pnidNaviera, ptipo_Maniobra, pobservaciones, pnidViaje, pregistro, pyear)
        If transaccion = 1 Then
		  Me.hfGuardar.Value = 1
          str_Mensaje = "Documento guardado con �xito, No olvide Firmar"
        Else
          str_Mensaje = "Error al guardar el documento"
        End If
      ElseIf tipoGuradado = 1 Then
        transaccion = dInventario_Naviero.Inventario_Naviero_Modificar(pnid, pnidDocumento, pnidBuque, pnombre_Buque, pnidNaviera, ptipo_Maniobra, pobservaciones, pnidViaje, pregistro, pyear)
        If transaccion = 1 Then
          str_Mensaje = "Documento actualizado con �xito, No olvide Firmar"
        Else
          str_Mensaje = "Error al actualizar documento"
        End If
      End If
        mensaje(str_Mensaje)
    Catch ex As Exception
      mensaje("Error al guardar archivo: " + ex.Message)
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para llamar al control ctlDocumentoFirmar el cual se encarga de mostrar la pantalla
  ''' para la carga de los archivos necesarios para la firma del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub firmarDocumento()
    Me.ctlDocumentoFirmar.CodigoDocumento = Me.ctlEncabezadoDocumento.TextoCodigo
    Me.mpeFirmarDocumento.Show()
  End Sub
  ''' <summary>
  ''' Metodo para realizar el firmado del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub firmar()
    Try
      Dim datosSolicitud As New DataAccesInventario_Naviero
      Dim datosGeneral As New DataAccesGenerales
      Dim dataLogin As New dataLogin
      dataLogin = Session("Data_Login")
      Dim firmarDocumento As New DataAccesFirmarDocumento()
      firmarDocumento.ContrasenaVal = ctlDocumentoFirmar.Contrasena
      firmarDocumento.DatosCertificadoVal = ctlDocumentoFirmar.DatosCertificadoCargado
      firmarDocumento.DatosLlaveVal = ctlDocumentoFirmar.DatosLlaveCargado
      firmarDocumento.NidDocumentoVal = ctlEncabezadoDocumento.NidDocumento
      firmarDocumento.NidUsuarioVal = datosGeneral.usuarioObtieneNidUsuario(dataLogin)
      firmarDocumento.XmlBaseValue = datosSolicitud.Inventario_Naviero_CadenaOriginalXMLChilkat(Me.ctlEncabezadoDocumento.NidDocumento)
      firmarDocumento.CodigoDocumentoVal = Me.ctlEncabezadoDocumento.TextoCodigo

      If firmarDocumento.firmarDocumentoXML() = DataAccesGenerales.transaccion.terminado Then
        Dim conDoc As New DataAccesGenerales
        If conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), enumEstadoDeDocumento.Aprobado, String.Empty, Session("Data_Login")) = DataAccesGenerales.transaccion.terminado Then
          Me.ctlEncabezadoDocumento.ObtenerDocumento(Me.ctlEncabezadoDocumento.NidDocumento)
          habilitarCampos(Me.ctlEncabezadoDocumento.EstadoDocumento)
          Me.ctlDocumentoFirmar.CelloDigital = firmarDocumento.CadenaHASHValue
          Me.ctlDocumentoFirmar.HabilitarFirmado = False
          mensaje("Confirmaci�n Realizada")
        Else
          mensaje("Error Inesperado No es posible realizar firmado")
        End If
      Else
        Me.ctlDocumentoFirmar.Mensaje = "No es posible realizar firmado"
        Me.mpeFirmarDocumento.Show()
      End If
    Catch ex As Exception
      Throw ex
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para generar una nueva clave de documento si borrar los datos actuales de la pagina
  ''' y asi permitir la edicion del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub editarDocumento()
    Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar
    Me.ctlEncabezadoDocumento.NidDocumento = 0
    Me.habilitarCampos(enumEstadoDeDocumento.NuevoAGuardar)
  End Sub
  ''' <summary>
  ''' Metodo para direccionar la pagina a donde se pueda ver el reporte del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub imprimirDocumento()
    'Response para direccionar al la pagina del reporte a imprimir
    'Response.Redirect("~\Documentos\Inventario_Naviero\Reporte\Inventario_NavieroReporte.aspx?" & "nidDocumento=" & Me.ctlEncabezadoDocumento.NidDocumento)
  End Sub
  ''' <summary>
  ''' Metodo para mostrar la incidencias del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub consultarIncidencias()
    Me.ctlDocumentoIncidencias.consultarIncidencias(Me.ctlEncabezadoDocumento.NidDocumento)
    Me.mpeDocIncidencias.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar la pantalla de cancelar documento la cual se encarga
  ''' de la cancelacion del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub cancelarDocumento()
    Me.mpeDocCancelar.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar un mensaje en la pantalla
  ''' </summary>
  ''' <param name="mensaje">mensaje a mostrar en pantalla</param>
  ''' <remarks></remarks>
  Private Sub mensaje(mensaje As String)
    Me.ctlDocumentoMensaje.Mensaje = mensaje
    Me.mpeMensaje.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar los mensajes de validacion
  ''' </summary>
  ''' <param name="mensaje"> mensaje a mostrar en pantalla</param>
  ''' <remarks></remarks>
  Public Sub mensajeValidacion(ByVal mensaje As String)
    Me.ctlMensajeValidacion.Mensaje = mensaje
    Me.mpeMenValidacion.Show()
  End Sub
  ''' <summary>
  ''' Metodo para confirmar el documento el cual puede ser
  ''' Cancelado o Aprobado
  ''' </summary>
  ''' <param name="tipoConfirmacion"> tipo de confirmacion deceada</param>
  ''' <remarks></remarks>
  Private Sub confirmarDocumento(ByVal tipoConfirmacion As enumEstadoDeDocumento)
    Dim conDoc As New DataAccesGenerales
    Dim transaccion As SByte

    Try
      Select Case tipoConfirmacion
        Case enumEstadoDeDocumento.Aprobado
          transaccion = conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), _
                                                  enumEstadoDeDocumento.Aprobado, String.Empty, Session("Data_Login"))
          If transaccion <> DataAccesGenerales.transaccion.transaccionNoTerminada Then
            Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Aprobado
            habilitarCampos(enumEstadoDeDocumento.Aprobado)
            mensaje("Confirmaci�n Realizada")
          End If

        Case enumEstadoDeDocumento.Rechazado
          transaccion = conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), _
                                                  enumEstadoDeDocumento.Rechazado, Me.ctlDocumentoCancelar.DescripcionCancelacion, Session("Data_Login"))
          If transaccion <> DataAccesGenerales.transaccion.transaccionNoTerminada Then
            Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Rechazado
            habilitarCampos(enumEstadoDeDocumento.Rechazado)
            mensaje("El documento ha sido cancelado")
          End If
      End Select

    Catch ex As Exception
      mensaje(ex.Message)
    End Try
  End Sub
  
  ''' <summary>
  ''' Metodo para verificar que los datos sean los correctos
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Private Function VerificarDatos() As Boolean
    Dim str_Mensaje As String = ""
    Dim bol_valor As Boolean = False
	Try
      
	  
      If str_Mensaje = "" Then
        bol_Valor = True
      Else
        bol_Valor = False
        mensajeValidacion("Datos no validos" + Chr(13) + str_Mensaje)
      End If

    Catch ex As Exception
      bol_Valor = False
      mensajeValidacion("Error en el metodo VerificarDatos(): " + ex.Message)
    End Try
	
    Return bol_valor
  End Function

  
#End Region
End Class
  
